// 嵌入式继承机制没有抽象方法,此时继承无法实现多态
// 上面的例子中，Dog3 类型重写了 Speak() 方法。然而如果父类型 Animal3 有另外一个方法 Play() 调用 Speak() 方法，但是 Dog3 没有重写 Play() 的时候，Dog3 类型的 Speak() 方法则不会被调用，因为Speak() 方法不是抽象方法，此时继承无法实现多态。
package main

import "fmt"

// Animal2 动物基类
type Animal1 struct {
	name string
}

func (a *Animal1) Play() {
	fmt.Println(a.Speak())
}

func (a *Animal1) Speak() string {
	return fmt.Sprintf("my name is %v", a.name)
}

func (a *Animal1) Name() string {
	return a.name
}

// Dog3 子类狗
type Dog struct {
	Animal1
	Gender string
}

func (d *Dog) Speak() string {
	return fmt.Sprintf("%v and my gender is %v", d.Animal1.Speak(), d.Gender)
}

func main() {
	d := Dog{
		Animal1: Animal1{name: "Hachiko"},
		Gender:  "male",
	}
	fmt.Println(d.Name())
	fmt.Println(d.Speak())
	d.Play() // Play() 中调用的是基类 Animal2.Speak() 方法，而不是 Dog3.Speak()
}
